package tools.conections.sql;

import java.sql.*;
import tools.GUI.PanelGUI;

/**
 *
 * @author Félix Marín Ramírez || felixmurcia@gmail.com
 * @version 1.0.1c
 */
public class ConexionSQL {

    private static Connection connection;

    /**
     *
     * @param host Parámetro de tipo String que contiene la ruta del servidor.
     * @param usuario Parámetro de tipo String que contiene el nombre del
     * usuario registrado en el servidor.
     * @param pass Contraseña del usuario.
     * @return Devuelve una conexión si se ha podido establecer, en otro caso
     * devolverá null.
     * @throws SQLException Excepción que proporciona información sobre los
     * errores en el acceso a la base de datos.
     */
    public Connection conexionOracle(String host, String usuario, String pass) throws SQLException {

        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (ClassNotFoundException e) {
            System.out.println("Hubo un problema con el Driver!");
            e.printStackTrace();
            return null;
        }

        connection = null;

        try {
            if (host == null || usuario == null || pass == null) {
                System.out.println("Argumentos no válidos");
                throw new SQLException();
            } else {
                connection = DriverManager.getConnection(
                        "jdbc:oracle:thin:@" + host + ":1521:XE", usuario,
                        pass);
            }
        } catch (SQLException e) {
            System.out.println("Fallo en la conexión al servidor Oracle.");
            return null;
        }

        if (connection != null) {
            connection.close();
            return connection;
        } else {
            return null;
        }
    }

//----------------------------------------------------------------------------//
    /**
     *
     * @param host Parámetro de tipo String que contiene la ruta del servidor.
     * @param usuario Parámetro de tipo String que contiene el nombre del
     * usuario registrado en el servidor.
     * @param pass Parámetro de tipo String que contiene la contraseña del
     * usuario.
     * @param databaseName Parámetro de tipo String que contiene nombre de la
     * base de datos.
     * @return Devuelve una conexión si se ha podido establecer, en otro caso
     * devolverá null.
     * @throws SQLException Excepción que proporciona información sobre los
     * errores en el acceso a la base de datos.
     */
    public Connection conexionMYSQL(String host, String usuario, String pass, String databaseName) throws SQLException {

        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            System.out.println("Hubo un problema con el Driver!");
            return null;
        }

        connection = null;

        try {
            connection = DriverManager.getConnection("jdbc:mysql://" + host + "/" + databaseName, usuario, pass);
        } catch (SQLException e) {
            System.out.println("Fallo en la conexión al servidor MYSQL.");
            return null;
        }

        if (connection != null) {
            connection.close();
            return connection;
        } else {
            return null;
        }
    }

    //----------------------------------------------------------------------------//
    /**
     *
     * @param host Parámetro de tipo String que contiene la ruta del servidor.
     * @param usuario Parámetro de tipo String que contiene el nombre del
     * usuario registrado en el servidor.
     * @param pass Parámetro de tipo String que contiene la contraseña del
     * usuario.
     * @param databaseName Parámetro de tipo String que contiene nombre de la
     * base de datos.
     * @return Devuelve una conexión si se ha podido establecer, en otro caso
     * devolverá null.
     * @throws SQLException Excepción que proporciona información sobre los
     * errores en el acceso a la base de datos.
     */
    public Connection conexionSQLServer(String host, String usuario, String pass, String databaseName) throws SQLException {

        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        } catch (ClassNotFoundException e) {
            System.out.println("Hubo un problema con el Driver!");
            return null;
        }
        //SQLServerException
        connection = null;

        try {
            connection = DriverManager.getConnection("jdbc:sqlserver://" + host + ";DatabaseName=" + databaseName, usuario, pass);
        } catch (SQLException e) {
            System.out.println("Fallo en la conexión al servidor SQL Server.");
            return null;
        }

        if (connection != null) {
            connection.close();
            return connection;
        } else {
            return null;
        }
    }

    //----------------------------------------------------------------------------//
    /**
     *
     * @param host Parámetro de tipo String que contiene la ruta del servidor.
     * @param usuario Parámetro de tipo String que contiene el nombre del
     * usuario registrado en el servidor.
     * @param pass Parámetro de tipo String que contiene la contraseña del
     * usuario.
     * @param databaseName Parámetro de tipo String que contiene nombre de la
     * base de datos.
     * @return Devuelve una conexión si se ha podido establecer, en otro caso
     * devolverá null.
     * @throws SQLException Excepción que proporciona información sobre los
     * errores en el acceso a la base de datos. throws SQLException
     */
    public Connection conexionPostgres(String host, String usuario, String pass, String databaseName) throws SQLException {

        //Connection connection;
        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException e) {
            System.out.println("Hubo un problema con el Driver!");
            return null;
        }

        connection = null;

        try {
            connection = DriverManager.getConnection("jdbc:postgresql://" + host + ":5432/" + databaseName, usuario, pass);
        } catch (SQLException e) {
            System.out.println("Fallo en la conexión al servidor Postgres.");
            return null;
        }

        if (connection != null) {
            connection.close();
            return connection;
        } else {
            return null;
        }
    }

    /**
     *
     * @param consulta Parámetro de tipo String el cual contendrá la select a
     * realizar en la base de datos.
     * @param campo Parámetro de tipo String el cual contendrá el campo de la
     * tabla solicitado.
     * @return Devuelve una cadena con el resultado de la consuta.
     * @throws SQLException Excepción que proporciona información sobre los
     * errores en el acceso a la base de datos. throws SQLException
     */
    public String consulta(String consulta, String campo) throws SQLException {
        Statement stmt = connection.createStatement();
        String resultado = "";

        if (consulta == null || connection == null || campo == null) {
            throw new IllegalArgumentException("No puede dejar panrametros nulos.");
        }

        if (stmt.executeQuery(consulta).wasNull()) {
            PanelGUI.mensajeError("Consulta no válida.");
            return "";
        } else {
            ResultSet rs = stmt.executeQuery(consulta);

            while (rs.next()) {
                consulta += "CEDULA " + rs.getString(campo) + "\n";
                //System.out.println("CEDULA " + rs.getString("cedula_cliente"));
            }

            stmt.close();
            connection.close();
            return resultado;

        }

    }

    /**
     *
     * @return Devuelve la conexión en el caso de que se haya establecido con
     * anterioridad, en otro caso de vuelve null.
     */
    public Connection conexion() {
        if (connection == null) {
            return null;
        } else {
            return connection;
        }
    }

    /**
     *
     * @return Devuelve verdadero si hay una conexión establecida, de lo
     * contrario devuelve falso.
     */
    public boolean conectado() {
        if (connection == null) {
            return false;
        } else {
            return true;
        }
    }

    /**
     *
     * @return Devuelve verdadero si se cierra la conexión, en otro caso
     * devuelve falso.
     * @throws SQLException
     */
    public boolean cerrarConexion() throws SQLException {
        if (connection == null) {
            return false;
        } else {
            connection.close();
            return true;
        }
    }
//    public static void main(String[] args) throws SQLException {
//        Connection cn1;
//        Connection cn2;
//        Connection cn3;
//        Connection cn4;
//        
//        
//        ConexionSQL csql = new ConexionSQL();
//        cn1 = csql.conexionMYSQL("localhost", "root", "mysql", "test");
//        System.out.println("MYSQL: " + csql.conectado(cn1));
//        cn2 = csql.conexionOracle("192.168.1.4", "EMPRESA", "EMPRESA");
//        System.out.println("ORACLE: " + csql.conectado(cn2));
//        cn3 = csql.conexionPostgres("192.168.0.4", "postgres", "1a2s3d4f_", "postgres");
//        System.out.println("POSTGRES: " + csql.conectado(cn3));
//        cn4 = csql.conexionSQLServer("localhost", "root", "mysql", "pruebasjava");
//        System.out.println("SQLSERVER: " + csql.conectado(cn4)); 
//    }
}
